package cn.vehicle.domains.ctx;

import cn.vehicle.domains.entity.*;
import cn.vehicle.domains.info.InternalCameraInfo;
import cn.vehicle.domains.info.InternalVehicleInfo;
import cn.vehicle.enums.GIoInTypeEnum;
import lombok.Data;

import java.util.Date;

/**
 * 车牌识别上下文对象
 * <p>
 * 用于封装一次车牌识别过程中的完整业务数据，
 * 包含车辆信息、相机信息、进出场类型、台账记录等内容。
 * 在识别业务中作为数据传递载体，贯穿整个处理流程。
 * </p>
 *
 * <p>主要作用：</p>
 * <ul>
 *   <li>承载相机上传的识别信息（车辆号牌、时间等）；</li>
 *   <li>关联系统中已登记的车辆与相机实体；</li>
 *   <li>为识别策略（如运输车辆、普通车辆）提供数据支撑；</li>
 *   <li>记录进出场及开闸动作等关键信息。</li>
 * </ul>
 */
@Data
public class PlateDetectContext {

    // 识别出的车牌号
    private String vehicleNumber;

    // 车牌识别设备上报的车辆基础信息（设备侧数据）
    private InternalVehicleInfo internalVehicleInfo;

    // 相机识别设备上报的相机基础信息（设备侧数据）
    private InternalCameraInfo internalCameraInfo;

    // 数据库中对应的相机实体信息
    private CameraEntity cameraEntity;

    // 系统中登记的普通车辆信息（数据库记录）
    private CommonVehicleEntity commonVehicleEntity;

    // 系统中登记的运输车辆信息（数据库记录）
    private TransportVehicleEntity transportVehicleEntity;

    // 普通车辆的通行台账记录，用于记录进出场数据
    private VehicleCommonLedgerEntity vehicleCommonLedgerEntity;

    // 运输车辆的通行台账记录，用于记录进出场数据
    private VehicleTransportLedgerEntity vehicleTransportLedgerEntity;

    // 进出场类型（IN：进厂，OUT：出厂）
    private String inOutType;

    // 车辆类型（COMMON：普通车辆，TRANSPORT：运输车辆）
    private String vehicleType;

    // 是否触发开闸（true：开闸，false：不开闸）
    private Boolean isOpen;

    // 抓拍时间（识别触发时间）
    private Date upTime;

    // 闸杆关闭时间（出入场结束时间）
    private Date downTime;

    // GPIO 输入类型，用于标识触发信号来源（例如地感、红外等）
    private GIoInTypeEnum gIoInType;


    /**
     * 设置相机实体信息
     * <p>
     * 同时自动同步相机的进出场类型（IN/OUT）。
     * </p>
     *
     * @param cameraEntity 相机实体对象
     */
    public void setCameraEntity(CameraEntity cameraEntity) {
        // 更新上下文中的相机信息并同步进出场类型
        this.cameraEntity = cameraEntity;
        this.setInOutType(cameraEntity.getInOutType());
    }

    /**
     * 设置普通车辆实体信息
     * <p>
     * 同时自动同步车辆类型字段（如 COMMON、TRANSPORT）。
     * </p>
     *
     * @param commonVehicleEntity 普通车辆实体对象
     */
    public void setCommonVehicleEntity(CommonVehicleEntity commonVehicleEntity) {
        // 更新普通车辆信息并设置车辆类型标识
        this.commonVehicleEntity = commonVehicleEntity;
        this.vehicleType = commonVehicleEntity.getVehicleType();
    }
}
